package com.example.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.mapper.SaleChanceMapper;
import com.example.pojo.SaleChance;
import com.example.service.ISaleChanceService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.util.AssertUtil;
import com.example.util.PhoneUtil;
import com.example.vo.DevResult;
import com.example.vo.ResultVo;
import com.example.vo.StateStatus;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.jayway.jsonpath.internal.Utils;
import org.apache.poi.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author wsl
 * @since 2022-04-04
 */
@Service
public class SaleChanceServiceImpl extends ServiceImpl<SaleChanceMapper, SaleChance> implements ISaleChanceService {
    @Autowired
    private SaleChanceMapper saleChanceMapper;

    /**
     * 修改营销机会
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public ResultVo updateSaleChance(SaleChance saleChance){
        //1、参数校验
        //  营销机会ID  非空,数据库中对应的记录存在
        AssertUtil.isTrue(null==saleChance.getId(),"待修改记录不存在！");
        //通过主键查询对象
        SaleChance temp = saleChanceMapper.selectById(saleChance.getId());
        //判断数据库中对应的记录存在
        AssertUtil.isTrue(temp==null,"待修改记录不存在！");
        //参数校验
        checkSaleChanceParams(saleChance.getCustomerName(),saleChance.getLinkMan(),saleChance.getLinkPhone());
        //2、设置相关参数默认值
        //updateDate更新时间设   置为系统当前时间
        saleChance.setUpdateDate(new Date());
        //assignMan分配人
        //判断原始数据是否存在
        if(StringUtil.isUnicodeString(temp.getAssignMan())){//不存在
            //判断修改后的值是否存在
            if(!StringUtil.isUnicodeString(saleChance.getAssignMan())){//修改前为空，修改后有值
                //assignTime指派时间    设置为系统当前时间
                saleChance.setAssignTime(new Date());
                //分配状态  1=已分配
                saleChance.setState(StateStatus.STATED.getType());
                //开发状态  1=开发中
                saleChance.setDevResult(DevResult.DEVING.getStatus());
            }
        }else {//存在
            //判断修改后的值是否存在
            if (StringUtil.isUnicodeString(saleChance.getAssignMan())) {//修改前有值，修改后无值
                //assignTime指派时间    设置为null
                saleChance.setAssignTime(null);
                //分配状态  0=未分配
                saleChance.setState(StateStatus.UNSTATE.getType());
                //开发状态  0=未发中
                saleChance.setDevResult(DevResult.UNDEV.getStatus());
            }else {//修改前有值，修改后有值
                //判断修改前后是否是同一个用户
                if (!saleChance.getAssignMan().equals(temp.getAssignMan())) {
                    //更新分配时间
                    saleChance.setAssignTime(new Date());
                }
            }
        }
        //3、执行修改操作，判断受影响的行数
        int i = saleChanceMapper.updateById(saleChance);
        return i != 1 ? ResultVo.error("修改失败") : ResultVo.ok("修改成功");
    }

    /**
     * 添加营销机会
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public ResultVo addSaleChance(SaleChance saleChance) {
        /*1、校验参数*/
        checkSaleChanceParams(saleChance.getCustomerName(),saleChance.getLinkMan(),saleChance.getLinkPhone());
        /*2、设置相关字段的默认值*/
        //isValid是否有效      (0=无效，1=有效)  设置为有效1=有效
        saleChance.setIsValid(1);
        //assignTime分配时间   默认为当前系统时间
        saleChance.setAssignTime(new Date());
        //createDate创建时间    默认为当前系统时间
        saleChance.setCreateDate(new Date());
        //updateDate更新时间    默认为当前系统时间
        saleChance.setUpdateDate(new Date());
        //创建人
        saleChance.setCreateMan("admin");
        //分配状态
        saleChance.setState(1);
        //判断是否设置分配人
        if(StringUtil.isUnicodeString(saleChance.getAssignMan())){
            //如果为空，则表示未设置分配人
            //state分配状态(0=未分配，1=已分配) 0=未分配
//            saleChance.setState(StateStatus.UNSTATE.getType());
            //assignTime指派时间设置为null
//            saleChance.setAssignTime(null);
            // devResult开发状态(O=未开发，1=开发中，2=开发成功，3=开发失败)0=未开发﹐（默认)
            saleChance.setDevResult(DevResult.UNDEV.getStatus());
        }else {
            //如果不为空，则表示设置了指派人
            // state分配状态(0=未分配，1=已分配)1=已分配
            saleChance.setState(StateStatus.STATED.getType());
            // devResult开发状态(0=未开发，1=开发中，2=开发成功，3=开发失败)1=开发中
            saleChance.setDevResult(DevResult.DEVING.getStatus());
        }
        //3、执行添加操作，判断受影响的行数
        int i = baseMapper.insert(saleChance);
        return i > 0 ? ResultVo.ok("添加成功") : ResultVo.error("添加失败");
    }
    //参数校验
    private void checkSaleChanceParams(String customerName, String linkMan, String linkPhone) {
        //customerName客户名名称         非空
        AssertUtil.isTrue(Utils.isEmpty(customerName),"客户名不能为空！");
        //linkMan联系人                非空
        AssertUtil.isTrue(Utils.isEmpty(linkMan),"联系人不能为空！");
        //linkPhone联系号码             非空
        AssertUtil.isTrue(Utils.isEmpty(linkPhone),"手机号码不能为空！");
        //linkPhone联系号码             非空，手机号码格式正确
        AssertUtil.isTrue(!PhoneUtil.isMobile(linkPhone),"联系号码格式不正确！");
    }

    /**
     * 查询所有
     */
    public List<SaleChance> selectAll(){
        QueryWrapper<SaleChance> wrapper = new QueryWrapper<SaleChance>().orderByDesc("id");
        return saleChanceMapper.selectList(wrapper);
    }
    /**
     * 查询回收站
     */
    public ResultVo deleted(){
        List<SaleChance> saleChances = baseMapper.selectDel();
        return ResultVo.response(saleChances);
    }

    /**
     * 无条件分页
     * @param pageNo  当前页码
     * @param pageSize 每页条数
     * @param customerName
     * @param createMan
     * @param state
     * @return
     */
    public PageInfo<SaleChance> electByPager(Integer pageNo, Integer pageSize, String customerName, String createMan, Integer state,Integer devResult,String chanceSource){
        //1、启动分页
        PageHelper.startPage(pageNo,pageSize);

        QueryWrapper<SaleChance> wrapper = new QueryWrapper<SaleChance>().orderByDesc("id");
        wrapper.like(!Utils.isEmpty(customerName),"customer_name",customerName)
                .like(!Utils.isEmpty(createMan),"create_man" ,createMan)
                .eq(state!=null,"state",state)
                .eq(devResult!=null,"dev_result",devResult)
                .like(!Utils.isEmpty(chanceSource),"chance_source",chanceSource);
        //2、紧接着查询操作
        List<SaleChance> list = baseMapper.selectList(wrapper);
        //3、组装
        return new PageInfo<>(list);
    }
}
